import java.util.*;
/*给你两个字符串 s 和 goal ，只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果，就返回 true ；否则返回 false 。
交换字母的定义是：取两个下标 i 和 j （下标从 0 开始）且满足 i != j ，接着交换 s[i] 和 s[j] 处的字符。
例如，在 "abcd" 中交换下标 0 和下标 2 的元素可以生成 "cbad" 。
示例 1：
输入：s = "ab", goal = "ba"
输出：true*/
public class Text {
    public static boolean check(String s, String goal) {
        Map<Character, Character> m1 = new HashMap<>();
        Map<Character, Character> m = new HashMap<>();
        boolean res = false;
        int count = 0;
        Set<Character> h = new HashSet<>();
        List<Integer> l = new ArrayList<>();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i), d = goal.charAt(i);
            if (!h.add(c)) { // 存在重复字符
                res = true;
            }
            if (c != d) {
                count++; // 记录不同字母数量
                l.add(i);
            }
            m1.put(c, d);
            m.put(d, c);
            if (c != d) {
                if (m1.containsKey(c) && m1.get(c) != d || m.containsKey(d) && m.get(d) != c) {
                    return false;
                }
            }
        }
        if (count == 0) return res;
        if (count == 2) {
            int t1 = l.get(0), t2 = l.get(1);
            return s.charAt(t1) == goal.charAt(t2) && s.charAt(t2) == goal.charAt(t1);
        }
        return true;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        String goal = sc.nextLine();
        boolean res = check(s, goal);
        System.out.println(res);
    }
}